package br.com.dispositivosmoveis.acompanhamentodeconta.service;

import java.util.List;

import android.database.sqlite.SQLiteConstraintException;
import br.com.dispositivosmoveis.acompanhamentodeconta.Enums.SituacaoNumeroComanda;
import br.com.dispositivosmoveis.acompanhamentodeconta.abstracts.ComandaService;
import br.com.dispositivosmoveis.acompanhamentodeconta.abstracts.ContaService;
import br.com.dispositivosmoveis.acompanhamentodeconta.abstracts.CrudService;
import br.com.dispositivosmoveis.acompanhamentodeconta.abstracts.NumeroComandaService;
import br.com.dispositivosmoveis.acompanhamentodeconta.abstracts.PedidoService;
import br.com.dispositivosmoveis.acompanhamentodeconta.abstracts.SharedPreferencesService;
import br.com.dispositivosmoveis.acompanhamentodeconta.app.App;
import br.com.dispositivosmoveis.acompanhamentodeconta.model.Comanda;
import br.com.dispositivosmoveis.acompanhamentodeconta.model.Conta;
import br.com.dispositivosmoveis.acompanhamentodeconta.model.Item;
import br.com.dispositivosmoveis.acompanhamentodeconta.model.Pedido;
import br.com.dispositivosmoveis.acompanhamentodeconta.repository.ComandaRepositoryImpl;
import br.com.dispositivosmoveis.acompanhamentodeconta.util.Constantes;

public class ComandaServiceImpl extends
		CrudService<Comanda, ComandaRepositoryImpl> implements ComandaService {

	private SharedPreferencesService sharedPreferencesService;
	private ContaService contaService;
	private PedidoService pedidoService;
	private NumeroComandaService numeroComandaService;
	
	public ComandaServiceImpl(){
		sharedPreferencesService = new SharedPreferencesServiceImpl(App.getInstance().getApplicationContext());
	}


	@Override
	public Long insert(Comanda comanda) throws Exception,
			SQLiteConstraintException {
		contaService = new ContaServiceImpl();
		numeroComandaService = new NumeroComandaServiceImpl();
		
		// cria uma nova conta
		Conta conta = new Conta();
		conta.setCodConta(contaService.generateCodConta(comanda.getNumeroComanda().getNumero()));
		conta.addComanda(comanda);
		
		long idConta = this.contaService.insert(conta);
		conta.setId((int)idConta);
		comanda.setConta(conta);
		
		long idComanda = this.getRepository().insert(comanda);
		comanda.setId((int)idComanda);
		
		comanda.getNumeroComanda().setSituacaoNumeroComanda(SituacaoNumeroComanda.I);
		this.numeroComandaService.updateSituacaoByNumero(comanda.getNumeroComanda().getNumero(), comanda.getNumeroComanda().getSituacaoNumeroComanda());
		
		this.sharedPreferencesService.setarValor(Constantes.ID_CONTA_KEY,comanda.getConta().getId());
		this.sharedPreferencesService.setarValor(Constantes.COD_CONTA_KEY, conta.getCodConta());
		this.sharedPreferencesService.setarValor(Constantes.ID_COMANDA_KEY, String.valueOf(comanda.getId()));
		
		//Mock para simulacao cadastro de pedidos
		Pedido pedido = new Pedido();
		Item item = new Item();
		item.setId(1);
		pedido.setComanda(comanda);
		pedido.setItem(item);
		
		this.InserirPedido(pedido);
		
		pedido = new Pedido();
		item = new Item();
		item.setId(2);
		pedido.setComanda(comanda);
		pedido.setItem(item);
		
		this.InserirPedido(pedido);
		
		pedido = new Pedido();
		item = new Item();
		item.setId(3);
		pedido.setComanda(comanda);
		pedido.setItem(item);
		
		this.InserirPedido(pedido);
		
		return null;
	}

	@Override
	public void update(Comanda entity) {
		// TODO Auto-generated method stub

	}

	@Override
	public Comanda obtain(int id) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Comanda> getAll() {
		// TODO Auto-generated method stub
		return null;
	}
	
	//Mock para simulacao cadastro de ComandaItem
	private void InserirPedido(Pedido pedido) throws SQLiteConstraintException, Exception{
		pedidoService = new PedidoServiceImpl();
		this.pedidoService.insert(pedido);
	}
}
